;:open4,4 ;:sys36864 ;.opt p4 *= $c000 ;startadresse 49152 ; ; multitask 49152 ; nikolaus heusler ; XXXXXXXXXXXX XX ; XXXX XXXXXXXX XX ; 5.91 ; ; konstanten ; tab =$e000 ;tabelle der startadressen taba =tab+64 ;speicher fuer akkumulator tabx =taba+32 ;speicher fuer x-register taby =tabx+32 ;speicher fuer y-register tabs =taby+32 ;speicher fuer prozessorstatus tabp =tabs+32 ;speicher fuer stackpointer stackt =$e100 ;zwischenspeicher fuer stack t =2 ;temporaer u =t+1 ;temporaer ; ; sprungtabelle ; jmp set ;einschalten jmp off ;abschalten jmp speed ;geschwindigkeit setzen ; ; programm ; ; parameteruebergabe ; set sei ;irq sperren lda #0 ldy #>tab sta t sty u ;zeiger auf tabelle sta bas ;flag fuer basic loeschen sta anz ;anzahl loeschen sta first ;abbruchflag loeschen getpar jsr 121 ;noch ein zeichen holen beq end ;keine zeichen, ende cmp #"," ;komma testen beq komma ;ja, dann ok jmp $af08 ;sonst syntax error komma jsr $aefd ;komma holen jsr 121 ;chrgot cmp #"&" ;und-symbol testen beq basic ;ja, dann basic-programm jsr $ad8a ;sonst adresse holen jsr $b7f7 ;und in high/low umrechnen ldy #0 lda $14 ;adresse low ora $15 ;adresse high beq ill ;beide null, dann fehler lda $14 ;low sta (t),y ;merken inc t lda $15 ;high sta (t),y ;speichern inc t inc anz ;anzahl erhoehen lda anz cmp #31 ;schon 31 bcs ill ;ja, dann fehler bcc getpar ;nein, dann weitermachen basic jsr 115 inc bas ;basic-flag setzen bne getpar ;und weitermachen ; ; vektoren setzen, taskwechsel starten ; end lda #0 ;ende-flag tay ;index sta (t),y iny sta (t),y ;tab-ende merken lda anz ;anzahl testen beq ill ;null, dann fehler sei lda #formirq sta $314 sty $315 ;neuen irq-vektor setzen lda #formnmi sta $fffa sty $fffb ;neuen nmi-vektor setzen lda #0 ;wechselflag sta t ;loeschen cli ;irq wieder zulassen baswart lda bas ;basic-flag beq baswart ;nein, dann endlosschleife rts ;sonst fertig und auch basic bearbeiten ; ; fehlerbehandlung ; ill jmp $b248 ;illegal quantity error ; ; routine abschalten ; off sei jsr 65418 ;vektoren korrigieren cli rts ;fertig ; ; geschwindigkeit einstellen ; speed jsr 121 ;parameter beq norm ;nein, dann norm jsr $b7f1 ;wert holen .byt $2c ;skip norm ldx #60 ;default-geschwindigkeit stx 56325 ;irq-speed rts ; ; task fertig (rts-befehl) ; dahin jmp dahin ;endlosschleife, falls task fertig dort =dahin-1 ;einsprungadresse ; ; neue irq-routine ; formirq lda 1 ;konfiguration sta jk+1 ;merken lda #48 sta 1 ;ram einblenden formlp ldy #0 lda (t),y ;tabelle lesen iny ora (t),y bne weiter sty first ;beide null, dann tab-ende dey sty t beq formlp ;tabelle auf anf. weiter dey ;gibt 0 lda (t),y ;adresse low lesen sta jl+1 ;und merken iny lda (t),y ;adresse high sta jh+1 ;merken ; adresse des aufrufenden programms mit adresse ; des naechsten tasks vertauschen tsx ;stackpointer lda $105,x ;stack lesen ldy #0 ;als index sta (t),y ;wert abspeichern iny lda $106,x ;startadresse high sta (t),y lda t lsr ;mal 2 tay ;tabellenzeiger lda taba,y sta ja+1 ;akkumulator lda tabx,y sta jx+1 ;x-register lda taby,y sta jy+1 ;y-register lda tabs,y sta js+1 ;status lda tabp,y sta jp+1 ;stackpointer lda $101,x sta taby,y ;alten y-wert vom stack lda $102,x sta tabx,y ;alten x-wert vom stack lda $103,x sta taba,y ;alten a-wert vom stack lda $104,x sta tabs,y ;alten s-wert vom stack txa sta tabp,y ;stackpointer merken lda t sta jt+1 clc adc #>stackt sta u ;stacktabelle ldy #0 sty t ;index dupst lda (t),y ;stack sta jr+1 ;in tabelle speichern lda $100,y sta (t),y jr lda #0 ;selbstmodifikation sta $100,y iny bne dupst jt lda #0 sta t lsr tay inc t inc t lda #>tab sta u jp ldx #0 ;selbstmodifikation txs ;stackpointer lda first bne jh ldx #247 ;standard-wert txs ;als stackpointer lda #>dort sta $108,x lda #